from fastapi import FastAPI, Body
from pydantic import BaseModel, Field
from typing import Optional

app = FastAPI()


class Item(BaseModel):
    name: str
    desc: Optional[str] = Field(
        None, title="这是描述", max_length=300
    )
    price: float = Field(..., gt=0, description="价格必须大于0")
    tax: Optional[float] = None


@app.post("/items/{itemid}")
async def update_items(itemid: int, item: Item = Body(..., embed=True)):
    results = {"itemid": itemid, "item": item}
    return results



'''
boby，Query、Path方法的父类都是直接或者间接的继承FieldInfo，而Field就是FieldInfo的实例化，FieldInfo继承了Representation，它们本质上就是Representation类的子类。所以他们几个的使用方法，和使用参数没有太大的区别。

请记住当你从 fastapi 导入 Query、Path 等对象时，他们实际上是返回特殊类的函数。

你可以在 Field、Query、Body 中声明额外的信息。这些信息将包含在生成的 JSON Schema 中。

'''
